const Article = require('../Models/article')
const User = require('../Models/user')
const Comment = require('../Models/comment')

// 返回文章发表页
exports.addPage = async ctx => {
  await ctx.render("add-article", {
    title: "文章发表页",
    session: ctx.session
  })
}

// 文章的发表保存到数据库
exports.add = async ctx => {
  if(ctx.session.isNew) { // 没登录
    return ctx.body = {
      msg: "用户未登录",
      status: 0
    }
  }

  // 用户登录成功
  // 在用户登录情况下， post 发过来的 数据
  const data = ctx.request.body
  // title content tips author ==> cookie || session
  data.author = ctx.session.uid
  data.commentNum = 0

  await new Promise((resolve, reject) => {
    new Article(data).save((err, data) => {
      if(err) return reject(err)
      // 更新文章计数
      User.updateOne({_id: data.author}, {$inc: {articleNum: 1}}, err => {
        if(err) return console.log(err)
      })
      
      
      resolve(data)
    })

  })
  .then(data => {
    ctx.body = {
      msg: "发表成功",
      status: 1
    }
  })
  .catch(err => {
    ctx.body = {
      msg: "发表失败",
      status: 0
    }
  })
}

// 获取所有用户 文章列表
exports.getList = async ctx => {
  // 查询每篇文章 头像
  let page = ctx.params.id || 1
  page --

  const maxNum = await Article.estimatedDocumentCount((err, num) => err?console.log(err):num)

  const artList = await Article
    .find()
    .sort("-created") // 按 创建时间 降序  排序  数字 时间排序
    .skip(5 * page)  // 跳过 前面的 5 * （page - 1）
    .limit(5) // 拿到 5 条文章
    .populate({  // ！！！ mongoose 用于 连表 查询
      path: "author", // 指向 何 表
      select: "username _id avatar"  // 连接哪些属性
    })
     // 执行前面的 find  exec 也可
    .then(data => data)
    .catch(err => console.log(err))

  await ctx.render("index", {
    session: ctx.session,
    title: "有一个论坛",
    artList,
    maxNum
  })

  // await cxt.render("index", {})
}

// 文章详情
exports.details = async ctx => {
  // 取动态路由里面的id
  const _id = ctx.params.id

  const article = await Article
    .findById(_id)
    .populate("author", "username")
    .then(data => data)
  

  // 查找当前文章关联的所有评论
  const comment = await Comment
    .find({article: _id}) // 匹配文章 _id
    .sort("-created")
    .populate("from", "username avatar")
    .then(data => data)
    .catch(err => {
      console.log(err)
    })

  await ctx.render("article", {
    title: article.title,
    session: ctx.session,
    article,
    comment
  })
}


// 查找指定用户的文章
exports.userArticles = async ctx => {
  const uid = ctx.session.uid

  // ctx.state = {
  //   userId: uid
  // }
  let page = parseInt(ctx.query.page) || 1
  let limit = parseInt(ctx.query.limit)

  page --

  const data = await Article
    .find({"author": uid}, "_id title tips commentNum created")
    .sort("-created")
    .skip(page * limit)
    .limit(limit)
    .then(data => data)

  const count = data.length
  // await next()

  ctx.body = {
    code: 0,
    msg: "请求数据成功",
    count,
    data
  }
}

// 删除某一篇文章 ====  先删文章 => 删文章下的所有评论  => 更新用户的 articleNum, commentNum
exports.amputate = async (ctx, next) => {
  const _id = ctx.params.id // 文章的 _id
  let res = {
    state: 1,
    message: "删除成功"
  }

  // 删除要删除文章实例对象
  await Article
    .findById({_id})
    .then(data => data.remove())
    .catch(err => {
      if(err) {
        console.log(err)
        res = {
          state: 0,
          message: "删除未成功"
        }
      }
    })

  ctx.body = res
}
